package interfaz;

import interfaz.ClientesInterfaz.calendar;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;

import org.freixas.jcalendar.DateEvent;
import org.freixas.jcalendar.DateListener;
import org.freixas.jcalendar.JCalendar;
import org.hibernate.Session;

import dao.ArticulosDAOImpl;
import dao.ClientesDAOImpl;
import dao.OfertasDAOImpl;
import dao.utils.HibernateUtil;
import domain.Articulos;
import domain.Clientes;
import domain.Empleados;
import domain.Ofertas;

public class OfertasInterfaz extends JFrame implements ActionListener,
		KeyListener, MouseListener {

	private static final long serialVersionUID = 1L;

	// Declaramos el objeto login
	private Login login;
	private int fila;

	private JPanel panelPrincipal;

	// Botn del panel Izquierdo
	private JButton btnCambioUsuario = new JButton("Cambio de usuario",
			new ImageIcon("images/people.png"));

	private boolean esAdministrador;
	// Paneles
	private JPanel panelCentral;
	private JPanel panelIzquierdo;

	private JTextField txtId = new JTextField();
	private JTextField txtCod = new JTextField();
	private JTextField txtFecha_Inicio = new JTextField();
	private JTextField txtFecha_Final = new JTextField();
	private JTextField txtPorcentaje = new JTextField();
	private JComboBox txtClase = new JComboBox();
	private JComboBox articulo = new JComboBox();

	private JLabel lbActiva = new JLabel("Activa (*)"); // Muestra mensajes por
	private JLabel lbActiva_ = new JLabel("Activa"); // pantalla
	private JLabel lbCod = new JLabel("Articulo (*)");
	private JLabel lbCod_ = new JLabel("Articulo");
	private JLabel lbFecha_Inicio = new JLabel("Fecha de Inicio (*)");
	private JLabel lbFecha_Inicio_ = new JLabel("Fecha de Inicio");
	private JLabel lbFecha_Final = new JLabel("Fecha de Finalidad (*)");
	private JLabel lbFecha_Final_ = new JLabel("Fecha de Finalidad");
	private JLabel lbPorcentaje = new JLabel("Porcentaje (*)");
	private JLabel lbPorcentaje_ = new JLabel("Porcentaje");
	private JLabel lbClase = new JLabel("Solo para socios (*)");
	private JLabel lbClase_ = new JLabel("Solo para socios");
	private JLabel lbEsAdministrador = new JLabel("Administrador (*)");

	private JButton btnAlta = new JButton("Guardar");
	private JButton btnBaja = new JButton("Baja");
	private JButton btnModif = new JButton("Modificar");
	private JButton btnLimpiar = new JButton("Limpiar");
	private JButton btnGuardar = new JButton("Guardar");
	private JButton btnReset = new JButton("Reset");
	private JButton btnFecha = new JButton("Selecciona Fecha");
	private JButton btnFecha2 = new JButton("Selecciona Fecha");

	private JCheckBox Activa = new JCheckBox();
	String[] elementosCombo = { "No", "Sí" };
	JComboBox comboBox = new JComboBox(elementosCombo);

	private JScrollPane scrollPanel = null;
	private JTable table = null;
	private TableRowSorter<ModeloTabla> elQueOrdena;

	private JLabel lbGestionOfertas;
	private JLabel lbAltaOfertas;

	private ModeloTabla modelo;

	private ArrayList<Ofertas> Cod = new ArrayList<Ofertas>();
	private ArrayList<Ofertas> Cod2 = new ArrayList<Ofertas>();
	private ArrayList<Articulos> arti = new ArrayList<Articulos>();
	private Ofertas oferta = new Ofertas();

	private boolean clase;

	Articulos articulo1 = new Articulos();

	private JCalendar calendarioFecha;
	int id;
	String articulos;
	Date fechaInicio;
	Date fechaFinal;
	int porcentaje;
	String clases;
	
	/**
	 * Es el constructor que borra toda la interfaz y la construye, además implemente los escuchadores 
	 * @param pCentral: es aquel que muestra los formularios, tablas... 
	 * @param pIzquierdo: es aquel que muestra el menú con los distintos paneles
	 * @param pPrincipal: es el contenedor padre
	 * @param login: pantalla de login
	 */
	public OfertasInterfaz(JPanel pCentral, JPanel pIzquierdo,
			JPanel pPrincipal, Login login) {

		this.login = login;
		panelCentral = pCentral;
		panelIzquierdo = pIzquierdo;

		panelCentral.removeAll();
		panelIzquierdo.removeAll();

		mostrarPanelCentralGestion();

		mostrarPanelIzquierdo();

		panelCentral.updateUI();
		panelIzquierdo.updateUI();
		panelPrincipal = pPrincipal;

		btnCambioUsuario.addMouseListener(this);
		btnGuardar.addMouseListener(this);
		// Se añaden los escuchadores de los botones Modificar, Baja y Limpiar
		btnModif.addActionListener(this);
		btnBaja.addActionListener(this);
		btnLimpiar.addActionListener(this);
		btnAlta.addActionListener(this);
		btnReset.addActionListener(this);
		btnFecha.addMouseListener(this);
		btnFecha2.addMouseListener(this);
		Activa.addMouseListener(this);
		txtFecha_Inicio.addKeyListener(this);
		txtFecha_Final.addKeyListener(this);
		txtClase.addActionListener(this);

	}
	
	/**
	 * Método que se encarga de mostrar nuestro panel de gestión con sus respectivos campos y botones
	 * Hace la llamada al método visualizarTabla();
	 */
	public void mostrarPanelCentralGestion() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "GESTIÓN OFERTAS",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbActiva_.setBounds(new Rectangle(75, 50, 140, 20));
		Activa.setBounds(new Rectangle(220, 50, 22, 20));
		lbCod_.setBounds(new Rectangle(75, 75, 140, 20));
		txtCod.setBounds(new Rectangle(220, 75, 80, 20));
		lbClase_.setBounds(new Rectangle(75, 100, 200, 20));
		txtClase.setBounds(new Rectangle(220, 100, 80, 20));
		txtClase.removeAllItems();
		txtClase.addItem("Todos");
		txtClase.addItem("Si");
		txtClase.addItem("No");

		panelCentral.add(lbActiva_);
		panelCentral.add(Activa);
		panelCentral.add(lbCod_);
		panelCentral.add(txtCod);
		panelCentral.add(lbClase_);
		panelCentral.add(txtClase);

		// Se añaden los escuchadores
		txtId.addKeyListener(this);
		txtCod.addKeyListener(this);
		txtClase.addKeyListener(this);

		// Se añade la tabla con todos los registros. Dentro de este método
		// actualizamos los cambios del panelCentral
		panelCentral.updateUI();
		visualizarTabla();
	}
	
	/**
	 * Método que se encarga de mostrar el panel de alta con sus respectivos campos
	 * Hace la llamada al método añadeBotones();
	 */
	public void mostrarPanelCentralAlta() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "ALTA OFERTAS",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbCod.setBounds(new Rectangle(75, 75, 140, 20));
		articulo.setBounds(new Rectangle(220, 75, 80, 20));
		Session sesion = HibernateUtil.getSession();
		// HibernateUtil.beginTransaction();
		List<Articulos> lista = new ArticulosDAOImpl(sesion).findAll();
		Iterator<Articulos> iter = lista.iterator();
		articulo.removeAllItems();
		while (iter.hasNext()) {
			Articulos article = (Articulos) iter.next();
			articulo.addItem(article.getNombre());
		}
		lbFecha_Inicio.setBounds(new Rectangle(75, 100, 140, 20));
		txtFecha_Inicio.setBounds(new Rectangle(220, 100, 200, 20));
		lbFecha_Final.setBounds(new Rectangle(75, 125, 120, 20));
		txtFecha_Final.setBounds(new Rectangle(220, 125, 200, 20));
		lbPorcentaje.setBounds(new Rectangle(75, 150, 120, 20));
		txtPorcentaje.setBounds(new Rectangle(220, 150, 200, 20));
		lbClase.setBounds(new Rectangle(75, 175, 200, 20));
		txtClase.setBounds(new Rectangle(220, 175, 80, 20));

		panelCentral.add(lbCod);
		panelCentral.add(articulo);
		panelCentral.add(lbFecha_Inicio);
		panelCentral.add(txtFecha_Inicio);
		panelCentral.add(lbFecha_Final);
		panelCentral.add(txtFecha_Final);
		panelCentral.add(lbPorcentaje);
		panelCentral.add(txtPorcentaje);
		panelCentral.add(lbClase);
		panelCentral.add(txtClase);

		// Se añaden los escuchadores
		txtCod.addKeyListener(this);

		txtPorcentaje.addKeyListener(this);
		txtClase.addKeyListener(this);
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();

		anadeBotones();
	}
	
	/**
	 * Método que limpia todos los campos
	 */
	public void limpiarJTextFields() {
		txtId.setText("");
		txtCod.setText("");
		txtFecha_Inicio.setText("");
		txtFecha_Final.setText("");
		txtPorcentaje.setText("");
		// txtClase.setText("");
	}
	
	/**
	 * Método que se encarga de mostrar el panel de modificar con sus respectivos campos
	 * y botones
	 */
	public void mostrarPanelCentralModificar() {
		
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)),
				"MODIFICAR DATOS EMPLEADO",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		/*
		 * Los componentes pueden colocarse exactamente donde el programador lo
		 * decida si en lugar de usar uno de los layouts predeterminados aplica
		 * el Layout null (setLayout(null)) y define la posición y dimensiones
		 * de cada componente con el método setBounds(int left,int top,int
		 * width,int height) de la clase Component. Este sistema tiene el
		 * inconveniente de que la presentación no se ajusta automáticamante
		 * cuando se cambian las dimensiones del contenedor o la ventana, pero
		 * en muchas ocasiones es útil y además cuando el programador quiere
		 * controlar todos los detalles no hay mejor opción.
		 */
		panelCentral.setLayout(null);
		
		
		// Se añaden los componentes
		lbCod.setBounds(new Rectangle(75, 75, 140, 20));
		articulo.setBounds(new Rectangle(220, 75, 120, 20));

		Session sesion = HibernateUtil.getSession();
		// HibernateUtil.beginTransaction();

		List<Articulos> lista = new ArticulosDAOImpl(sesion).findAll();
		Iterator<Articulos> iter = lista.iterator();
		articulo.removeAllItems();
		while (iter.hasNext()) {
			Articulos article = (Articulos) iter.next();
			articulo.addItem(article.getNombre());
		}
		articulo.setSelectedItem(articulos);

		Ofertas ofer = new OfertasDAOImpl(sesion).findById(id);
		
		lbFecha_Inicio.setBounds(new Rectangle(75, 100, 140, 20));
		txtFecha_Inicio.setBounds(new Rectangle(220, 100, 200, 20));

		txtFecha_Inicio.setText(ofer.getFechaHoraInicio().getDay() + "/"
				+ (ofer.getFechaHoraInicio().getMonth() + 1) + "/"
				+ (1900 + ofer.getFechaHoraInicio().getYear()));

		lbFecha_Final.setBounds(new Rectangle(75, 125, 120, 20));
		txtFecha_Final.setBounds(new Rectangle(220, 125, 200, 20));

		txtFecha_Final.setText(ofer.getFechaHoraFinal().getDay() + "/"
				+ (ofer.getFechaHoraFinal().getMonth() + 1) + "/"
				+ (1900 + ofer.getFechaHoraFinal().getYear()));

		lbPorcentaje.setBounds(new Rectangle(75, 150, 120, 20));
		txtPorcentaje.setBounds(new Rectangle(220, 150, 200, 20));
		txtPorcentaje.setText(ofer.getPorcentaje() + "");
		
		lbClase.setBounds(new Rectangle(75, 175, 200, 20));
		txtClase.setBounds(new Rectangle(220, 175, 50, 20));

		txtClase.removeAllItems();
		txtClase.addItem("Si");
		txtClase.addItem("No");

		if (clase) {
			txtClase.setSelectedIndex(0);
		} else {
			txtClase.setSelectedIndex(1);
		}

		panelCentral.add(lbCod);
		panelCentral.add(articulo);
		panelCentral.add(lbFecha_Inicio);
		panelCentral.add(txtFecha_Inicio);
		panelCentral.add(lbFecha_Final);
		panelCentral.add(txtFecha_Final);
		panelCentral.add(lbPorcentaje);
		panelCentral.add(txtPorcentaje);
		panelCentral.add(lbClase);
		panelCentral.add(txtClase);

		if (esAdministrador == true) {
			comboBox.setSelectedIndex(1); // Selecciona "Sí"
		} else {
			comboBox.setSelectedIndex(0); // Selecciona "No"
		}

		// Se añaden los escuchadores
		txtCod.addKeyListener(this);

		txtPorcentaje.addKeyListener(this);
		txtClase.addKeyListener(this);
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();

		// Se añaden los botones Alta y Limpiar
		btnGuardar.setBounds(new Rectangle(375, 300, 130, 30));
		panelCentral.add(btnGuardar);
		btnReset.setBounds(new Rectangle(525, 300, 130, 30));
		panelCentral.add(btnReset);
		btnFecha.setBounds(new Rectangle(450, 100, 135, 20));
		panelCentral.add(btnFecha);
		btnFecha2.setBounds(new Rectangle(450, 125, 135, 20));
		panelCentral.add(btnFecha2);
		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();
		HibernateUtil.closeSession();
	}
	
	/**
	 * Método que se encarga de mostrar el panel izquierdo con sus respectivos paneles
	 * y boton de cambio de usuario
	 */
	public void mostrarPanelIzquierdo() {

		// Pone un borde y un título al panel
		panelIzquierdo.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "MÓDULO OFERTAS",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		// Zona rígida (RigidArea): proporciona un área invisible de separación
		// horizontal y
		// vertical. En una caja horizontal, la separación vertical afectará a
		// todos sus
		// componentes y viceversa.
		Box caja = Box.createVerticalBox();
		// Se ponen las opciones disponibles para el módulo gestión de empleados
		// como etiquetas.
		lbGestionOfertas = new JLabel("Gestión Ofertas");

		// Se cambia el color de la etiqueta que va estar seleccionada por
		// defecto a un azul fuerte.
		lbGestionOfertas.setForeground(new Color(0, 0, 128));
		caja.add(lbGestionOfertas);
		caja.add(Box.createRigidArea(new Dimension(40, 15)));
		lbAltaOfertas = new JLabel("Alta Oferta");
		caja.add(lbAltaOfertas);

		// Se añaden los escuchadores de los JLabels
		lbGestionOfertas.addMouseListener(this);
		lbAltaOfertas.addMouseListener(this);

		// Se aaden las restricciones a la fila 0, columna 0
		GridBagConstraints constraintsCaja = new GridBagConstraints();
		constraintsCaja.anchor = GridBagConstraints.NORTHWEST;
		constraintsCaja.gridx = 0; // El rea de texto empieza en la columna
									// cero.
		constraintsCaja.gridy = 0; // El rea de texto empieza en la fila cero
		constraintsCaja.insets = new Insets(0, 0, 345, 0);

		// Se aade la caja con sus restricciones al panelIzquierdo
		panelIzquierdo.add(caja, constraintsCaja);

		// Se aaden las restricciones a la fila 1, columna 0
		GridBagConstraints constraintsCambioUsuario = new GridBagConstraints();
		constraintsCambioUsuario.gridx = 0; // El rea de texto empieza en la
											// columna cero.
		constraintsCambioUsuario.gridy = 1; // El rea de texto empieza en la
											// fila cero

		// Se aade el botn cambio de usuario con sus restricciones al
		// panelIzquierdo
		panelIzquierdo.add(btnCambioUsuario, constraintsCambioUsuario);
	}
	
	/**
	 * Método que genera la tabla
	 */
	public void visualizarTabla() {

		Ofertas oferta; // Utilizado para guardar los datos que vamos
						// extrayendo de la consulta

		// Borramos si hubiese alguna otra tabla, para poderla actualizar a la
		// actual
		if (scrollPanel != null) {
			panelCentral.remove(scrollPanel);
		}

		// Abrimos una sesión en Hibernate para poder realizar la consulta
		Session sesion = HibernateUtil.getSession();
		// Obtenemos todos los empleados de la tabla empleados de la Base de
		// datos del proyecto.
		List<Ofertas> lista = new OfertasDAOImpl(sesion).findAll();

		Iterator<Ofertas> iter = lista.iterator();

		modelo = new ModeloTabla();
		table = new JTable(modelo);

		// Añadimos los títulos de las columnas de la tabla
		modelo.addColumn("Id");
		modelo.addColumn("Articulo");
		modelo.addColumn("Fecha de Inicio");
		modelo.addColumn("Fecha de Finalización");
		modelo.addColumn("Porcentaje");
		modelo.addColumn("Clase");

		Cod = new ArrayList<Ofertas>();
		Cod2 = new ArrayList<Ofertas>();

		// Declaramos una fila con 7 columnas. Estas 7 columnas componen cada
		// fila de nuestra tabla de búsquedas.
		String[] fila = new String[12];
		// Recorremos el Iterador mientras hayan elementos
		while (iter.hasNext()) {
			// Extraemos el objeto del Iterador obtenido de la lista de
			// resultados de la consulta realizada con Hibernate a la
			// base de datos.
			oferta = (Ofertas) iter.next();
			Cod.add(oferta);
			Cod2.add(oferta);
			arti.add(oferta.getArticulos());

			// Extraemos los datos de cada columna
			fila[0] = oferta.getIdOfertas().toString();
			fila[1] = oferta.getArticulos().getNombre();
			String tmp = oferta.getFechaHoraInicio().getDay() + "/"
					+ (oferta.getFechaHoraInicio().getMonth() + 1) + "/"
					+ (1900 + oferta.getFechaHoraInicio().getYear());
			fila[2] = tmp;
			String tmp2 = oferta.getFechaHoraFinal().getDay() + "/"
					+ (oferta.getFechaHoraFinal().getMonth() + 1) + "/"
					+ (1900 + oferta.getFechaHoraFinal().getYear());
			fila[3] = tmp2;
			fila[4] = oferta.getPorcentaje() + "";
			boolean tmp3 = oferta.isClase();
			if (tmp3) {
				fila[5] = "Solo para socios";
			} else {
				fila[5] = "Para todos";
			}

			modelo.addRow(fila); // Añade una fila al final de la tabla

		}

		elQueOrdena = new TableRowSorter<ModeloTabla>(modelo);
		table.setRowSorter(elQueOrdena);

		// Hacemos que sólo se pueda seleccionar una fila de la tabla
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		// Bloqueamos que las columnas de la tabla se pueden deslizar y cambiar
		// de posicion con el movimiento del mouse
		table.getTableHeader().setReorderingAllowed(false);

		// Le añadimos un scroll a la tabla
		scrollPanel = new JScrollPane(table);
		scrollPanel.setBounds(new Rectangle(75, 200, 1000, 150));
		panelCentral.add(scrollPanel);

		// Se añaden los botones Modificar, Baja y Limpiar
		btnModif.setBounds(new Rectangle(330, 400, 130, 30));
		btnBaja.setBounds(new Rectangle(480, 400, 130, 30));
		btnLimpiar.setBounds(new Rectangle(630, 400, 130, 30));
		panelCentral.add(btnModif);
		panelCentral.add(btnBaja);
		panelCentral.add(btnLimpiar);
		table.addMouseListener(this);

		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		HibernateUtil.closeSession();
	}
	
	/**
	 * Método que añade los botones
	 */
	public void anadeBotones() {

		// Se añaden los botones Modificar, Baja y Limpiar
		btnAlta.setBounds(new Rectangle(375, 300, 130, 30));
		panelCentral.add(btnAlta);
		btnLimpiar.setBounds(new Rectangle(525, 300, 130, 30));
		panelCentral.add(btnLimpiar);
		btnFecha.setBounds(new Rectangle(450, 100, 135, 20));
		panelCentral.add(btnFecha);
		btnFecha2.setBounds(new Rectangle(450, 125, 135, 20));
		panelCentral.add(btnFecha2);

		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		// HibernateUtil.closeSession();
	}
	
	/**
	 * Clase que instancia el calendario
	 * @author Alverto
	 *
	 */
	class calendar extends JPanel {
		JCalendar cal;

		public calendar() {
			setLayout(new BorderLayout());
			cal = new JCalendar();
			add(cal, BorderLayout.CENTER);
			cal.addDateListener(new DateListener() {

				@Override
				public void dateChanged(DateEvent arg0) {
					txtFecha_Final.setText(cal.getDate().getDate() + "/"
							+ (cal.getDate().getMonth() + 1) + "/"
							+ (cal.getDate().getYear() + 1900));

				}
			});
		}
	}
	

	/**
	 * Clase que instancia el calendario
	 * @author Alverto
	 *
	 */
	class calendar1 extends JPanel {
		JCalendar cal1;

		public calendar1() {
			setLayout(new BorderLayout());
			cal1 = new JCalendar();
			add(cal1, BorderLayout.CENTER);
			cal1.addDateListener(new DateListener() {

				@Override
				public void dateChanged(DateEvent arg0) {
					txtFecha_Inicio.setText(cal1.getDate().getDate() + "/"
							+ (cal1.getDate().getMonth() + 1) + "/"
							+ (cal1.getDate().getYear() + 1900));

				}
			});
		}
	}
	
	/**
	 * Método que se encarga de realizar una acción determinada cuando se pulsa
	 * cualquier componente de la interfaz
	 */
	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == btnAlta) { // Se pulsa el botón Alta
			Session sesion = HibernateUtil.getSession();
			HibernateUtil.beginTransaction();
			Cod2 = new ArrayList<Ofertas>();
			for (int x = 0; x < articulo.countComponents(); x++) {
				for (int y = 0; y < Cod.size(); y++) {
					if ((Cod.get(y).getArticulos().getNombre())
							.equalsIgnoreCase(articulo.getItemAt(x).toString())) {
						Cod2.add(Cod.get(y));
					}
				}
			}

			Articulos articulo1 = new ArticulosDAOImpl(sesion).findByDni(Cod2
					.get(fila).getArticulos().getIdArticulo());

			try {
				Ofertas oferta = new Ofertas();
				oferta.setArticulos(articulo1);
				Date fecha = new Date();

				String[] date = txtFecha_Inicio.getText().split("/");

				fecha.setDate(Integer.parseInt(date[0]));
				fecha.setMonth(Integer.parseInt(date[1]) - 1);
				fecha.setYear(Integer.parseInt(date[2]) - 1900);
				oferta.setFechaHoraInicio(fecha);
				
				Date fecha2 = new Date();
				String[] date2 = txtFecha_Final.getText().split("/");
				fecha2.setDate(Integer.parseInt(date2[0]));
				fecha2.setMonth(Integer.parseInt(date2[1]) - 1);
				fecha2.setYear(Integer.parseInt(date2[2]) - 1900);
				oferta.setFechaHoraFinal(fecha2);
				
				System.out.println(fecha2.getDate()+"/"+fecha2.getMonth()+"/"+fecha2.getYear());

				oferta.setPorcentaje(Integer.parseInt(txtPorcentaje.getText()));

				String nomTMP = (String) txtClase.getSelectedItem();
				if (nomTMP.equalsIgnoreCase("Si")) {
					oferta.setClase(true);
				} else {
					oferta.setClase(false);
				}

				boolean clie = new OfertasDAOImpl(sesion).guardarOferta(oferta);
				HibernateUtil.endTransaction();
				// HibernateUtil.closeSession();
				JOptionPane.showMessageDialog(null, "Oferta insertada");
			} catch (Exception e2) {
				JOptionPane.showMessageDialog(null, e2.getMessage());
			}

		}

		if (e.getSource() == btnModif) { // Se pulsa el botón Modificar
			mostrarPanelCentralModificar();
		}

		if (e.getSource() == btnBaja) { // Se pulsa el botón Baja

			Cod2 = new ArrayList<Ofertas>();
			for (int x = 0; x < arti.size(); x++) {

				for (int y = 0; y < Cod.size(); y++) {

					if ((Cod.get(y).getArticulos().getNombre())
							.equalsIgnoreCase(arti.get(x).getNombre())) {
						Cod2.add(Cod.get(y));
					}
				}
			}
			int seleccion = JOptionPane.showConfirmDialog(this,
					"¿Confirma que quiere borrar el registro con id"
							+ id + "?",
					"Baja de oferta", JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				// BORRAR
				try {
					Session sesion = HibernateUtil.getSession();
					HibernateUtil.beginTransaction();
					Ofertas ofer = new OfertasDAOImpl(sesion).findById(id);
					new OfertasDAOImpl(sesion).borrarOferta(id);

					HibernateUtil.endTransaction();
					// HibernateUtil.closeSession();
				} catch (Exception e2) {
					// TODO: handle exception
					JOptionPane.showMessageDialog(null,
							"Oferta no registrada. No se puede dar de baja");
					HibernateUtil.deshacerTransaccion();
				}
//				//modelo.removeRow(fila);
//				table.updateUI();
//				limpiarJTextFields();
				JOptionPane.showMessageDialog(null, "La oferta con id "
						+ id + " ha sido borrada.");
				mostrarPanelCentralGestion();
			} else if (seleccion == JOptionPane.NO_OPTION) {
				JOptionPane.showMessageDialog(null,
						"La operación ha sido cancelada");
			}

		}

		if (e.getSource() == btnLimpiar) { // Se pulsa el botón Limpiar
			// Muestra todos los registros de la tabla. Se han quitado los
			// filtros
			elQueOrdena.setRowFilter(null);
			// Inicializamos las variables de los JtextFields
			limpiarJTextFields();
		}

		if (e.getSource() == txtClase) {
			try {

				if (txtClase.getSelectedItem().toString()
						.equalsIgnoreCase("Si")) {

					elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
							+ "Solo para socios" + ".*", 5));

				} else if (txtClase.getSelectedItem().toString()
						.equalsIgnoreCase("No")) {
					elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*"
							+ "Para todos" + ".*", 5));
				} else {
					elQueOrdena.setRowFilter(null);
				}
			} catch (Exception e2) {
				// TODO: handle exception

			}

			if (e.getSource() == btnReset) { // Se pulsa el
												// botón Reset
												// en la
												// pantalla
												// modificación
												// datos ofertas
				mostrarPanelCentralModificar();
			}

			
		}
	}
	
	/**
	 * Método que se encarga de realizar una acción determinada cuando se pulsa
	 * cualquier componente de la interfaz
	 */
	public void mouseClicked(MouseEvent e) {
		if (e.getSource() == lbGestionOfertas) { // Se pulsa la etiqueta del
													// panel Izquierdo Gestión
													// de empleados
			new OfertasInterfaz(panelCentral, panelIzquierdo, panelPrincipal, login);
			
		}
		
		if (e.getSource() == btnGuardar) { // Se pulsa el botón Guardar
			// en la pantalla
			// modificación datos
			// empleado
			/*- En la linea 1 se puede observar que cree una variable entera, el null que se antepone al mensaje es necesario, ya que este se toma cuando el usuario pulsa la tecla Esc o presiona Cancelar, el mensaje a mostrar se usa como en los anteriores cuadros de dialogo.
			 - En las lineas 2 y 4 se usan condicionales para tomar las acciones respectivas de acuerdo a la opción que haya dado el usuario.
			 - En las lineas 3 y 5 se muestran mensaje correspondientes a la respectiva opción que haya dado el usuario.*/
			Session sesion = HibernateUtil.getSession();
			HibernateUtil.beginTransaction();
			int seleccion = JOptionPane.showConfirmDialog(this,
					"¿Confirma que quiere modificar la oferta con id "
							+ id + "?",
					"Guardar oferta", JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				Ofertas ofer = new OfertasDAOImpl(sesion).findById(id);
				try {
					Articulos tmp3 = arti.get(articulo.getSelectedIndex());

					ofer.setArticulos(tmp3);

					Date fecha = new Date();
					String[] date = txtFecha_Inicio.getText().split("/");

					fecha.setDate(Integer.parseInt(date[0]));
					fecha.setMonth(Integer.parseInt(date[1]) - 1);
					fecha.setYear(Integer.parseInt(date[2]));

					ofer.setFechaHoraInicio(fecha);

					Date fecha2 = new Date();
					String[] date2 = txtFecha_Final.getText().split("/");

					fecha2.setDate(Integer.parseInt(date2[0]));
					fecha2.setMonth(Integer.parseInt(date2[1]) - 1);
					fecha2.setYear(Integer.parseInt(date2[2]));

					ofer.setFechaHoraFinal(fecha2);

					ofer.setPorcentaje(Integer.parseInt(txtPorcentaje
							.getText()));

					String tmp2 = txtClase.getSelectedItem().toString();

					boolean tmp = false;
					if (tmp2 == "Si") {
						tmp = true;
					} else if (tmp2 == "No") {
						tmp = false;
					}

					ofer.setClase(tmp);
					//Session sesion = HibernateUtil.getSession();
					// Se inicia la transacción de modificación del empleado
					//HibernateUtil.beginTransaction();
					// Se realiza la modificación
					new OfertasDAOImpl(sesion).modificarOferta(ofer);
					// Se cierra la transacción
					HibernateUtil.endTransaction();
					// Se cierra la sesión
					HibernateUtil.closeSession();

				} catch (Exception e2) {
					JOptionPane.showMessageDialog(null,
							"Oferta no registrado. No se puede modificar.");
				}
				JOptionPane.showMessageDialog(null, "La oferta con id "
						+ id + " ha sido modificada.");
				// Se vuelve a mostrar el panel central de Gestión
				mostrarPanelCentralGestion();
			} else {
				// JOptionPane.showMessageDialog(null,
				// "La operación ha sido cancelada");
				JOptionPane.showMessageDialog(null,
						"La operación ha sido cancelada");
				// Se vuelve a mostrar el panel central de Gestión
				mostrarPanelCentralGestion();
			}
		}
		if (e.getSource() == lbAltaOfertas) { // Se pulsa la etiqueta del panel
												// Izquierdo Alta de empleados
			mostrarPanelCentralAlta();
			// Se cambia el color de la etiqueta Alta de empleados a un azul
			// fuerte.
			lbAltaOfertas.setForeground(new Color(0, 0, 128));
			// Se cambia el color de la etiqueta Alta de empleados a negro.
			lbGestionOfertas.setForeground(new Color(0, 0, 0));
		}
		
		if (e.getSource() == btnFecha) {
			JFrame frame = new JFrame("Calendario");
			frame.getContentPane()
					.add(new calendar1(), BorderLayout.CENTER);
			frame.setSize(600, 300);
			frame.setVisible(true);
		}

		if (e.getSource() == btnFecha2) {
			JFrame frame = new JFrame("Calendario");
			frame.getContentPane().add(new calendar(), BorderLayout.CENTER);
			frame.setSize(600, 300);
			frame.setVisible(true);
		}

		if (e.getSource() == btnCambioUsuario) {
			int seleccion = JOptionPane.showConfirmDialog(this,
					"Desea realmente cambiar de usuario?",
					"Cambio de usuario", JOptionPane.YES_NO_OPTION);
			if (seleccion == JOptionPane.YES_OPTION) {
				// Se llama al objeto Login para que vuelva cargar el login
				// de
				// la aplicacin a travs del mtodo iniciar
				login.iniciar(panelPrincipal);
			}
		}

		if (e.getSource() == Activa) {

			if (Activa.isSelected()) {

				for (int x = 0; x < Cod.size(); x++) {
					Date fechaActual = new Date();
					for (int i = table.getRowCount() - 1; i >= 0; i--) {
						modelo.removeRow(i);
					}
					if (Cod.get(x).getFechaHoraInicio().getYear() == fechaActual
							.getYear()) {

						if (Cod.get(x).getFechaHoraInicio().getMonth() == fechaActual
								.getMonth()) {

							if (Cod.get(x).getFechaHoraInicio().getDate() <= fechaActual
									.getDate()
									&& Cod.get(x).getFechaHoraFinal().getDate() >= fechaActual
											.getDate()) {
								// System.out.println(Cod.size());
								// Oferta activada
								String fila[] = new String[6];
								fila[0] = Cod.get(x).getIdOfertas().toString();
								fila[1] = Cod.get(x).getArticulos().getNombre();
								String tmp = Cod.get(x).getFechaHoraInicio()
										.getDay()
										+ "/"
										+ (Cod.get(x).getFechaHoraInicio()
												.getMonth() + 1)
										+ "/"
										+ (1900 + Cod.get(x)
												.getFechaHoraInicio().getYear());
								fila[2] = tmp;
								String tmp2 = Cod.get(x).getFechaHoraFinal()
										.getDay()
										+ "/"
										+ (Cod.get(x).getFechaHoraFinal()
												.getMonth() + 1)
										+ "/"
										+ (1900 + Cod.get(x)
												.getFechaHoraFinal().getYear());
								fila[3] = tmp2;
								fila[4] = Cod.get(x).getPorcentaje() + "";
								boolean tmp3 = Cod.get(x).isClase();
								if (tmp3) {
									fila[5] = "Solo para socios";
								} else {
									fila[5] = "Para todos";
								}

								modelo.addRow(fila);

							}
						}
					} else {
						// El año de la oferta no es el actual
					}
				}
			} else {
				mostrarPanelCentralGestion();
			}
		}

	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}
	
	
	@Override
	public void mouseReleased(MouseEvent e) {

		if (e.getSource() == table) {
			JTable tablaAuxiliar = table;
			tablaAuxiliar.updateUI();
			int fila = table.rowAtPoint(e.getPoint());

			if ((fila > -1)) {
				id = Integer.parseInt(tablaAuxiliar.getValueAt(fila, 0)
						.toString());
				
				if (tablaAuxiliar.getValueAt(fila, 1) == null) {
					articulos = "";
				} else {
					articulos = tablaAuxiliar.getValueAt(fila, 1).toString();
				}

				if (tablaAuxiliar.getValueAt(fila, 2) == null) {

				} else {
					Date fecha = new Date();
					String[] fechaInicio = tablaAuxiliar.getValueAt(fila, 2)
							.toString().split("/");

					fecha.setDate(Integer.parseInt(fechaInicio[0]));
					fecha.setMonth(Integer.parseInt(fechaInicio[1]) - 1);
					fecha.setYear(Integer.parseInt(fechaInicio[2]) - 1900);
				}
				
				if (tablaAuxiliar.getValueAt(fila, 3) == null){
					
				}else{
					Date fecha = new Date();
					String[] fechaFinal = tablaAuxiliar.getValueAt(fila, 3)
							.toString().split("/");

					fecha.setDate(Integer.parseInt(fechaFinal[0]));
					fecha.setMonth(Integer.parseInt(fechaFinal[1]) - 1);
					fecha.setYear(Integer.parseInt(fechaFinal[2]) - 1900);
				}
				if(tablaAuxiliar.getValueAt(fila, 4) == null){
					porcentaje = 0;
				}else{
					porcentaje = Integer.parseInt(tablaAuxiliar.getValueAt(fila, 4).toString());
				}
				
				if(tablaAuxiliar.getValueAt(fila, 5) == null){
					clases = "";
				}else{
					clases = tablaAuxiliar.getValueAt(fila, 5).toString();
				}

			}

			Cod2 = new ArrayList<Ofertas>();
			for (int x = 0; x < arti.size(); x++) {
				for (int y = 0; y < Cod.size(); y++) {
					if ((Cod.get(y).getArticulos().getNombre())
							.equalsIgnoreCase(arti.get(x).getNombre())) {
						Cod2.add(Cod.get(y));
					}
				}
			}
			oferta = Cod.get(fila);
			clase = oferta.isClase();
		}
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyReleased(KeyEvent e) {
		String nombre = txtCod.getText();

		// Suponemos que en dni y tlf no van a haber acentos
		// Hacemos que nombre sea insensible a acentos
		nombre = nombre.replace("a", "(a|á|A|Á)");
		nombre = nombre.replace("e", "(e|é|E|É)");
		nombre = nombre.replace("i", "(i|í|I|Í)");
		nombre = nombre.replace("o", "(o|ó|O|Ó)");
		nombre = nombre.replace("u", "(u|ú|U|Ú)");
		nombre = nombre.replace("A", "(a|á|A|Á)");
		nombre = nombre.replace("E", "(e|é|E|É)");
		nombre = nombre.replace("I", "(i|í|I|Í)");
		nombre = nombre.replace("O", "(o|ó|O|Ó)");
		nombre = nombre.replace("U", "(u|ú|U|Ú)");

		if (nombre.equalsIgnoreCase("")) {
			elQueOrdena.setRowFilter(null);
		} else {
			elQueOrdena.setRowFilter(RowFilter.regexFilter("(?i).*" + nombre
					+ ".*", 1));

		}
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

}
